package org.gridlab.gridsphere.services.visualization;

import java.io.*;
import java.util.Iterator;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import javax.portlet.*;
import javax.imageio.stream.MemoryCacheImageOutputStream;
import org.jfree.chart.JFreeChart;

/**
 * Klasa abstrakcyjna do generowania wykresów za pomocą biblioteki JFreeChart
 * @author Krzysztof Goj
 */
public abstract class ImageChartGenerator extends ChartGenerator {

    /**
     * Tworzy nowy obiekt typu ImageChartGenerator
     * @param dp DataProvider z danymi dla tego typu wykresu
     * @param c Kontekst portletu
     */
    public ImageChartGenerator(DataProvider dp, PortletContext c) {
        super(dp, c);
    }

    /**
     * Generuje wykres na podstawie wprowadzonych danych
     * @throws org.gridlab.gridsphere.services.visualization.ChartGeneratorException 
     * @throws java.io.IOException Wyjątek generowany, gdy wystąpi błąd I/O
     */
    protected void generateChart() throws ChartGeneratorException, IOException {
        doJFreeChartStuff();
        BufferedImage img = chart.createBufferedImage(getWidth(), getHeight());

        Iterator iter = ImageIO.getImageWritersByFormatName("JPG");
        if (iter.hasNext()) {
            ImageWriter writer = (ImageWriter) iter.next();
            ImageWriteParam iwp = writer.getDefaultWriteParam();
            iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            iwp.setCompressionQuality(0.95f);
            String destfile = context.getRealPath(getURL());
            MemoryCacheImageOutputStream mos = 
                new MemoryCacheImageOutputStream(new FileOutputStream(destfile));
            writer.setOutput(mos);
            IIOImage image = new IIOImage(img, null, null);
            writer.write(null, image, iwp);
        }
    }

    /**
     * Wykorzystuje bibliotekę JFreeChart do wygenerowania wykresu
     * @throws org.gridlab.gridsphere.services.visualization.ChartGeneratorException 
     */
    protected abstract void doJFreeChartStuff() throws ChartGeneratorException;

    private String getURL() {
        return "/charts/" + getURLNamePart() + ".jpg";
    }

    /**
     * Produkuje kod HTML osadzający wykres
     * @param request Obiekt żądania od klienta
     * @param response Obiekt odpowiedzi do klienta
     * @throws org.gridlab.gridsphere.services.visualization.ChartGeneratorException 
     * @throws java.io.IOException Wyjątek generowany, gdy wystąpi błąd I/O
     */
    public void embedChart(RenderRequest request, RenderResponse response) throws ChartGeneratorException, IOException {
        prepare();
        PrintWriter out = new PrintWriter(response.getWriter());
        out.print("<img alt=\"beautiful chart\" src=\"");
        out.print(request.getContextPath()+getURL());
        out.print("\" /> ");
    }

    /**
     * Wykres
     */
    protected JFreeChart chart;
}


